
import Vue from 'vue'
import axios from 'axios'
import router from "@/router";
import store from '@/store'
import { serverIp } from "../../public/config";
import Cookies from 'js-cookie'

// import { Message, Notification } from 'element-ui'

axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8'
// 创建axios实例
const request = axios.create({
    // baseURL: `http://${serverIp}:8081`,
    baseURL: process.env.VUE_APP_BASE_API,
    timeout: 20000
})

// request 拦截器
// 可以自请求发送前对请求做一些处理
// 比如统一加token，对请求参数统一加密
request.interceptors.request.use(config => {
    // console.log(config);
    // console.log(JSON.stringify(config.headers));

    // 是否需要设置 token，目前只有登录、注册接口不需要
    const isToken = (config.headers || {}).isToken === false
    if (Cookies.get("Admin-Token") && !isToken) {
        // 让每个请求携带自定义token 请根据实际情况自行修改
        config.headers['token'] = Cookies.get("Admin-Token");
    }
    // 上传文件时，需要附带body信息，就要加这个header
    if (!config.headers.hasContentType) {
        config.headers['Content-Type'] = 'application/json;charset=utf-8';
    }
    let user = localStorage.getItem("user") ? JSON.parse(localStorage.getItem("user")) : null
    if (user) {
        config.headers['token'] = user.token;  // 设置请求头
    }
    return config
}, error => {
    return Promise.reject(error)
});

// response 拦截器
// 可以在接口响应后统一处理结果
request.interceptors.response.use(
    res => {
        console.log(res);
        // 如果是返回的文件
        if (res.request.responseType === 'blob' || res.request.responseType === 'arraybuffer') {
            return res.data
        }
        // 兼容服务端返回的字符串数据
        // if (typeof res.data === 'string') {
        //     res.data = res.data ? JSON.parse(res.data) : res.data
        // }

        let msg = res.data.msg;
        // 未设置状态码则默认成功状态
        const code = res.data.code || 200;
        console.log("response-code：" + code);
        // 如果是后台自定义的异常，直接展示给用户
        if (code == 500) {
            Vue.prototype.$message.error(msg);
            // 抛出异常
            return Promise.reject(new Error(msg));
        } else if (code == 401) {
            // 当权限验证不通过的时候给出提示
            Vue.prototype.$message.error("登录状态已过期，您可以继续留在该页面，或者重新登录。");
            store.dispatch('FedLogOut').then(() => {
                // location.href = '/login';
                // router.push("/login")
            })
            return Promise.reject('error');
        } else if ((/(^2[0-9]*)$/.test(code)) || code == 0) {
            // 正则表达式判断以2开头
            return res;
        } else {
            Vue.prototype.$message.error("请求出错：" + msg);
            Vue.prototype.$notify.error({ title: msg });
            return Promise.reject('error');
        }
        return res;
    },
    error => {
        // for debug
        console.log('err:' + error)
        return Promise.reject(error)
    }
)

export default request